package com.sbs.gaoxinqutoilet.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

/**
 * Created by 聪明一只哈 on 2018/6/11.
 * Time: 2018/6/11  12:42
 * 悬浮按钮2
 */

public class MyFloatButton extends FloatingActionButton {

    private int parentHeight;
    private int parentWidth;

    public MyFloatButton(Context context) {
        super(context);
    }

    public MyFloatButton(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MyFloatButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }


    private int lastX;
    private int lastY;

    private boolean isDrag;

//    @Override
//    public boolean onTouchEvent(MotionEvent event) {
//        int rawX = (int) event.getRawX();
//        int rawY = (int) event.getRawY();
//        switch (event.getAction() & MotionEvent.ACTION_MASK) {
//            case MotionEvent.ACTION_DOWN:
//                setPressed(true);
//                isDrag=false;
//                getParent().requestDisallowInterceptTouchEvent(true);
//                lastX=rawX;
//                lastY=rawY;
//                ViewGroup parent;
//                if(getParent()!=null){
//                    parent= (ViewGroup) getParent();
//                    parentHeight=parent.getHeight();
//                    parentWidth=parent.getWidth();
//                }
//                break;
//            case MotionEvent.ACTION_MOVE:
//                if(parentHeight<=0||parentWidth==0){
//                    isDrag=false;
//                    break;
//                }else {
//                    isDrag=true;
//                }
//                int dx=rawX-lastX;
//                int dy=rawY-lastY;
//                //这里修复一些华为手机无法触发点击事件
//                int distance= (int) Math.sqrt(dx*dx+dy*dy);
//                if(distance==0){
//                    isDrag=false;
//                    break;
//                }
//                float x=getX()+dx;
//                float y=getY()+dy;
//                //检测是否到达边缘 左上右下
//                x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;
//                y=getY()<0?0:getY()+getHeight()>parentHeight?parentHeight-getHeight():y;
//                setX(x);
//                setY(y);
//                lastX=rawX;
//                lastY=rawY;
//                Log.i("aa","isDrag="+isDrag+"getX="+getX()+";getY="+getY()+";parentWidth="+parentWidth);
//                break;
//            case MotionEvent.ACTION_UP:
//                if(!isNotDrag()){
//                    //恢复按压效果
//                    setPressed(false);
//                    //Log.i("getX="+getX()+"；screenWidthHalf="+screenWidthHalf);
//                    if(rawX>=parentWidth/2){
//                        //靠右吸附
//                        animate().setInterpolator(new DecelerateInterpolator())
//                                .setDuration(500)
//                                .xBy(parentWidth-getWidth()-getX())
//                                .start();
//                    }else {
//                        //靠左吸附
//                        ObjectAnimator oa=ObjectAnimator.ofFloat(this,"x",getX(),0);
//                        oa.setInterpolator(new DecelerateInterpolator());
//                        oa.setDuration(500);
//                        oa.start();
//                    }
//                }
//                break;
//        }
//        //如果是拖拽则消s耗事件，否则正常传递即可。
//        return !isNotDrag() || super.onTouchEvent(event);
//    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                setPressed(true);             //设置该Button状态为摁下 Pressed状态
                isDrag = false;               //首次摁下时设置 正在拖拽？false

                //表示子组件要自己消费这次事件，告诉父组件不要拦截（抢走）这次的事件
                getParent().requestDisallowInterceptTouchEvent(true);
                lastX = rawX;
                lastY = rawY;       //记录上次首次触碰到屏幕时Button的坐标  (lastX ,lastY)
                ViewGroup parent;
                if (getParent() != null) {                          //如果有父容器
                    parent = (ViewGroup) getParent();
                    parentHeight = parent.getHeight();            //获取容器的高度
                    parentWidth = parent.getWidth();             //获取容器的宽度
                }
                break;

            case MotionEvent.ACTION_MOVE:
                //如果没有父容器直接退出，不实现拖拽移动，限定button只能在有父容器的情况下实现有范围的移动
                if (parentHeight <= 0 || parentWidth == 0) {

                    isDrag = false;                          //不能拖拽
                    break;                                  //直接退出
                } else {
                    isDrag = true;                        //正在拖拽
                }
                int dx = rawX - lastX;                  //获取手势X坐标轴上的实时位移量
                int dy = rawY - lastY;                 //获取手势Y坐标轴上的实时位移量


                //这里修复一些华为手机无法触发点击事件

                int distance = (int) Math.sqrt(dx * dx + dy * dy);
                if (distance == 0) {
                    isDrag = false;
                    break;
                } else {


                    //getX（）当前view距离父容器左边缘的距离 +dx 手势X坐标实时位移量 = 意图当前view距离父容器左边缘的距离
//getY（）当前view距离父容器顶部边缘的距离 +dy 手势Y坐标实时位移量 = 意图view距离父容器顶部边缘的距离

                    float x = getX() + dx;
                    float y = getY() + dy;


//检测是否到达边缘 左上右下   并且限制view的移动范围为其父容器范围
//x < 0            表示向左移动超出父容器
//此时设置 x = 0    继续向左拖拽悬浮按钮不移动
//x > parentWidth-getWidth()        表示向右移动超出父容器
//此时设置 x = parentWidth-getWidth()
//代表往X坐标轴上右方向移动的最大偏移量为  父容器宽度-自身宽度  (因为Button的右边也不能超出屏幕所以减去button宽度)

//getY() < 0       表示当前Button超出父容器上方    ->
//令 y = 0   回到 父容器正上方
//getY()+ getHeight > parentHeight  表示  当前Button超出父容器下方
//令 y = 父容器高度  -  Button高度   回到父容器正下方


                    x = x < 0 ? 0 : x > parentWidth - getWidth() ? parentWidth - getWidth() : x;
                    y = getY() < 0 ? 0 : getY() + getHeight() > parentHeight ? parentHeight - getHeight() : y;


                    setX(x);           //设置当前view距离父容器左边缘的距离
                    setY(y);          // 设置当前view距离父容器左边缘的距离
                    lastX = rawX;
                    lastY = rawY;
                }
                break;
            case MotionEvent.ACTION_UP:
                if (isDrag) {
                    setPressed(false);
                }
                break;
        }

        //如果是拖拽则消耗事件，否则正常传递即可。
        return isNotDrag() || super.onTouchEvent(event);
    }

    private boolean isNotDrag() {
        return !isDrag && (getX() == 0
                || (getX() == parentWidth - getWidth()));
    }


}
